package com.lsa.skienna.challenge.chap6;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;

import junit.framework.TestCase;

import com.lsa.helpers.Utils;
import com.lsa.skienna.challenge.chap6.Fibs.TaskReader;

public class TestFibs  extends TestCase{
	public void testFibs() throws Throwable{
		TaskReader reader = new TaskReader(new FileInputStream("data/pc6/fibs/less1000.txt"));
		BigDecimal[] task;
		
		List<Integer> counts = new ArrayList<Integer>();
		
		/*
		
		
		1 4
		2 4
		3 4
		0 5
		1 5
		2 5
		3 5
		4 5
		0 6
		1 6
		2 6
		3 6
		4 6
		5 6
		0 7
		1 7
		2 7
		3 7
		4 7
		5 7
		6 7
		0 8
		1 8
		34 88
		34 144
		1597 2584
		1596 2584
		1596 2585
		1 13
		1 34
		0 34
		1597 1597
		1596 1597*/
		
//		int[] arr = Utils.createIntArray1D("1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584");
//		System.out.println(arr.length);
		
		counts.add(1); // 0 1 _1_
		counts.add(2); // 0 2 _2_
		counts.add(2); // 1 2 _3_
		counts.add(3); // 0 3 _4_
		counts.add(3); // 1 3 _5_
		counts.add(2); // 2 3 _6_
		counts.add(3); // 0 4 _7_
		counts.add(3); // 1 4 _8_
		counts.add(2); // 2 4 _9_
		counts.add(1); // 3 4 _10_
		counts.add(4); // 0 5 _11_
		counts.add(4); // 1 5 _12_
		counts.add(3); // 2 5 _13_
		counts.add(2); // 3 5 _14_
		counts.add(1); // 4 5 _15_
		counts.add(4); // 0 6 _16_
		counts.add(4); // 1 6 _17_
		counts.add(3); // 2 6 _18_
		counts.add(2); // 3 6 _19_
		counts.add(1); // 4 6 _20_
		counts.add(1); // 5 6 _21_
		counts.add(4); // 0 7 _22_
		counts.add(4); // 1 7 _23_
		counts.add(3); // 2 7 _24_
		counts.add(2); // 3 7 _25_
		counts.add(1); // 4 7 _26_
		counts.add(1); // 5 7 _27_
		counts.add(0); // 6 7 _28_
		counts.add(5); // 0 8 _29_
		counts.add(5); // 1 8 _30_
		counts.add(2); //34 88 _31_
		counts.add(4); // 34 144 _32_
		counts.add(2); //1597 2584 _33_
		counts.add(2); // 1596 2584 _34_
		counts.add(2); //1596 2585 _35_
		counts.add(6); //1 13 _36_
		counts.add(8); //1 34 _37_
		counts.add(8); //0 34 _38_
		counts.add(1); // 1597 1597 _39_
		counts.add(1); // 1596 1597 _40_
		counts.add(16); // 2 2584 _41_
		counts.add(5); //10 100 _42_
		counts.add(4); //1234567890 9876543210 _43_
		counts.add(4); //1234567890 9876543209 _44_
		counts.add(4); //1234567891 9876543209 _45_
		counts.add(479); //1234567891 9876543209 _46_
		
		int i = 0;
		
		while((task = reader.readNextTask())!= null){
			if (task[0].equals(BigDecimal.ZERO) && task[1].equals(BigDecimal.ZERO)) break;
			int idx = i++;
			int cnt = Fibs.count(task);
			assertTrue(String.format("failure at line %s. Expected %s, got %s", i, counts.get(idx), cnt), counts.get(idx).equals(cnt));
		}
		
		System.out.println(i);
	}
	
	public void testFibPairs() throws Throwable{
		TaskReader reader = new TaskReader(new FileInputStream("data/pc6/fibs/allfibs.txt"));
		BigDecimal[] task;
		
		int i = 0;
		
		while((task = reader.readNextTask())!= null){
			if (task[0].equals(BigDecimal.ZERO) && task[1].equals(BigDecimal.ZERO)) break;
			i++;
			int cnt = Fibs.count(task);
			assertTrue(String.format("failure at line %s. Expected %s, got %s", i, 2, cnt), 2 == cnt);
		}
	}
	
	public void testFibPairsDisturbed() throws Throwable{
		TaskReader reader = new TaskReader(new FileInputStream("data/pc6/fibs/pairsDisturbed.txt"));
		BigDecimal[] task;
		
		int i = 0;
		
		int[] expected = new int[]{1,2,2,1,2,2,0,1,1};
		
		while((task = reader.readNextTask())!= null){
			if (task[0].equals(BigDecimal.ZERO) && task[1].equals(BigDecimal.ZERO)) break;
			i++;
			int cnt = Fibs.count(task);
			assertTrue(String.format("failure at line %s. Expected %s, got %s", i, expected[(i-1) % expected.length], cnt), expected[(i-1) % expected.length] == cnt);
		}
	}
}
